//
//  GLAnimation.h
//  LMPhotoVideoSDK
//
//  Created by Aimar on 16/7/19.
//  Copyright © 2016年 魁钺会. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import "GLInterpolator.h"
#import "Matrix.hpp"

/**
 *  动画重复模式
 */
typedef NS_ENUM(NSInteger, GLAnimationRepeatMode) {
    /**
     *  反复
     */
    GLAnimationRepeatMode_Reverse,
    /**
     *  重新开始
     */
    GLAnimationRepeatMode_Restart
};


@class GLAnimation;

/**
 *  动画监听回调方法
 */
@protocol GLAnimationDelegate <NSObject>
/**
 *  动画已开始
 *
 *  @param animation 当前动画
 */
-(void)onAnimationStart:(GLAnimation*)animation;
/**
 *  动画重复
 *
 *  @param animation 当前动画
 */
-(void)onAnimationRepeat:(GLAnimation*)animation;
/**
 *  动画结束
 *
 *  @param animation 当前动画
 */
-(void)onAnimationEnd:(GLAnimation*)animation;

@end

/**
 *  动画（参考android视图动画机制）
 */
@interface GLAnimation : NSObject {
    long   _currentTime;
    float  _normalizeTime;
    int    _repeated;
    BOOL   _toReverse;
    BOOL   _more;
    BOOL   _cycleFlip;
    BOOL   _oneMoreTime;
    BOOL   _started;
    BOOL   _ended;
}
/**
 *  动画监听委托
 */
@property (nonatomic, weak)id<GLAnimationDelegate>  delegate;
/**
 *  持续时间（ms）
 */
@property (nonatomic, assign)long                   duration;
/**
 *  重复次数
 */
@property (nonatomic, assign)long                   repeatCount;
/**
 *  重复模式
 */
@property (nonatomic, assign)GLAnimationRepeatMode  repeatMode;
/**
 *  插值器
 */
@property (nonatomic, strong)GLInterpolator*    interpolator;
/**
 *  是否允许停留在动画
 */
@property (nonatomic, assign)BOOL   fillEnabled;
/**
 *  保持动画结束状态
 */
@property (nonatomic, assign)BOOL   fillAfter;
/**
 *  保持动画开始状态
 */
@property (nonatomic, assign)BOOL   fillBefore;
/**
 *  是否初始化
 */
@property (nonatomic, assign)BOOL   initialized;
/**
 *  开始时间延迟（ms）
 */
@property (nonatomic, assign)long   startOffset;
/**
 *  开始时间（ms）
 */
@property (nonatomic, assign)long   startTime;

/**
 *  当前时间开始动画（ms）
 */
- (void)startNow;
/**
 *  第一时间开始动画
 */
- (void)start;
/**
 *  指定时间开始动画
 *
 *  @param startTimeMillis 开始时间（ms）
 */
- (void)setStartMillisTime:(long)startTimeMillis;
/**
 *  取消动画
 */
- (void)cancel;
/**
 *  初始化
 *
 *  @param size       动画对象尺寸
 *  @param parentSize 动画对象父层尺寸
 */
- (void)initializeWithSize:(CGSize)size parentSize:(CGSize)parentSize;
/**
 *  动画驱动方法
 *
 *  @param currentTime 当前时间(ms)
 *  @param transform   动画结果保存在转换矩阵中
 *
 *  @return 动画是否进行中
 */
- (BOOL)getTransformation:(long)currentTime outTransform:(mat4*)transform;
/**
 *  子类复写方法，实现各动画的矩阵转换
 *
 *  @param interpolatedTime 插值时间(0 ~ 1)
 *  @param transform        动画结果保存在转换矩阵中
 */
- (void)applyTransformation:(float)interpolatedTime outTransform:(mat4*)transform;
/**
 *  xxxx
 *
 *  @return xxxx
 */
- (BOOL)willChangeTransformationMatrix;

- (BOOL)willChangeBounds;
@end
